#include "mainwindow.h"

#include <memory>

#include <qaction.h>
#include <qdialog.h>
#include <qmenu.h>
#include <qmenubar.h>
#include <qmessagebox.h>

MainWindow::MainWindow(QWidget *parent) : QMainWindow{parent} {
  setWindowTitle(tr("main"));
  setFixedSize(800, 600);

  open_action = new QAction(QIcon(":/images/doc-open"), tr("&Open..."), this);
  open_action->setStatusTip(tr("open an exist file"));
  open_action->setShortcuts(QKeySequence::Open);
  connect(open_action, &QAction::triggered, this, &MainWindow::open);
  connect(open_action, &QAction::triggered, this, &MainWindow::change_title);

  QMenu *file = menuBar()->addMenu(tr("&File"));

  file->addAction(open_action);

  statusBar();
}

MainWindow::~MainWindow() {}

void MainWindow::open() {
  QDialog dialog(this); // 这里传不传入 this 效果是不同的
  dialog.setWindowTitle(tr("Hello, dialog!"));
  dialog.exec();
  // dialog.show();
  // 这个不会阻塞当前线程，所以会很快运行完这个函数然后被自动析构，所以需要在堆上分配
  // 这时需要管理生命周期，传入this的话可以解决一部分问题，但需要父窗口析构才会将其析构，某些情况下可能会导致生命周期过长
  // 一种正确做法是：dialog->setAttribute(Qt::WA_DeleteOnClose);
  // 参考： QDialog 的 show, exec, open 区别

  // QMessageBox::information(this, tr("Information"), tr("Open"));
}